home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / cli / mcommands-1.2.lha / Src / clickstart.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-02  |  5.2 KB  |  211 lines

  1. /****************************************************************************/
  2. /*            clickstart.c - enable/disbale features of AmigaDOS            */
  3. /*                    Copyright © 1994 Michael Letowski                     */
  4. /****************************************************************************/
  5.  
  6. #define __USE_SYSBASE
  7.  
  8. #include <exec/types.h>
  9. #include <exec/execbase.h>
  10. #include <dos/rdargs.h>
  11. #include <dos/dosextens.h>
  12. #include <dos/var.h>
  13. #include <devices/trackdisk.h>
  14. #include <support/types.h>
  15. #include <support/exec.h>
  16.  
  17. #include <string.h>
  18.  
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21.  
  22. #include "clickstart.rev.h"
  23.  
  24. #define DOS_NAME        "dos.library"
  25. #define DOS_VERN        37L
  26. #define TRACK_NAME    "trackdisk.device"
  27.  
  28. #define TEMPLATE        "CLICK/S,NOCLICK/S,STAR/S,NOSTAR/S,PIPE/K,NOPIPE/S,"\
  29.                                         "MULTI/K,NOMULTI/S,ALERT/K/N,QUIET/S"
  30.  
  31. #define OPT_CLICK        0
  32. #define OPT_NOCLICK    1
  33. #define OPT_STAR        2
  34. #define OPT_NOSTAR    3
  35. #define OPT_PIPE        4
  36. #define OPT_NOPIPE    5
  37. #define OPT_MULTI        6
  38. #define OPT_NOMULTI    7
  39. #define OPT_ALERT        8
  40. #define OPT_QUIET        9
  41. #define OPT_COUNT        10
  42.  
  43. #define STATE_CLICK    0
  44. #define STATE_STAR    1
  45. #define STATE_PIPE    2
  46. #define STATE_MULTI    3
  47. #define STATE_ALERT    4
  48. #define STATE_COUNT    5
  49.  
  50. /* Pipe enable/disable */
  51. #define PIPE_VAR_NAME        "_pchar"
  52.  
  53. /* Multi command enable/disable */
  54. #define MULTI_VAR_NAME    "_mchar"
  55.  
  56. #define VAR_PIPE                0
  57. #define VAR_MULTI                1
  58. #define VAR_COUNT                2
  59.  
  60. #define VAR_LEN                    1
  61. #define VAR_FLAGS                (LV_VAR | GVF_LOCAL_ONLY)
  62. #define VAR_SIZE                (VAR_LEN+3)
  63.  
  64. #define QUOTES                    (('\''<<24) | ('\''<<8))
  65.  
  66. /* Default pipe and multi characters */
  67. #define DEF_PIPE                "|"
  68. #define DEF_MULTI                "\\"
  69.  
  70. /* On/off texts */
  71. #define ON                            "ON"
  72. #define OFF                            "OFF"
  73. #define UNKNOWN                    "?"
  74.  
  75. #define PStr(arg,def)        (*(arg)=='\0' ? (def) : (arg))
  76. #define AlTime(time)        ((time)>0 ? (time) : 0)
  77.  
  78. STATIC CONST TEXT VersionString[]=
  79.     VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
  80.  
  81. STATIC LONG HandleVar(STRPTR varName, STRPTR varVal, STRPTR defVal, LONG off,
  82.                                             BOOL *error, STRPTR result, struct DosLibrary *DOSBase);
  83.  
  84. ULONG ClickStart(VOID)
  85. {
  86.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  87.     struct DosLibrary *DOSBase;
  88.  
  89.     struct RDArgs *Args;
  90.     struct MsgPort *Port;
  91.     struct IOExtTD *IO;
  92.     UBYTE *PubFlags;
  93.     LONG *DOSFlags;
  94.     LONG Options[OPT_COUNT];
  95.     ULONG Unit,RC=RETURN_FAIL;
  96.     STRPTR States[STATE_COUNT];
  97.     CHAR PipeVal[VAR_SIZE],MultiVal[VAR_SIZE];
  98.     BOOL ErrOccured=TRUE;
  99.  
  100.     unless(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN))
  101.     {
  102.         SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
  103.         goto InvalidDOS;
  104.     }
  105.  
  106.     clear(&Options);                                        /* Clear out buffer */
  107.     unless(Args=ReadArgs(TEMPLATE,Options,NULL))
  108.     {
  109.         PrintFault(IoErr(),NULL);                    /* Inform user */
  110.         goto NoArgs;
  111.     }
  112.  
  113.     /* Handle clicking */
  114.     States[STATE_CLICK]=UNKNOWN;
  115.     if(Port=CreateMsgPort())
  116.     {
  117.         if(IO=CreateIORequest(Port,sizeof(struct IOExtTD)))
  118.         {
  119.             ErrOccured=FALSE;                                /* Everything OK so far */
  120.             for(Unit=0; Unit<4; Unit++)
  121.             {
  122.                 if(OpenDevice(TRACK_NAME,Unit,(struct IORequest *)IO,0)==0)
  123.                 {
  124.                     PubFlags=&((struct TDU_PublicUnit *)IO->iotd_Req.io_Unit)->tdu_PubFlags;
  125.                     if(Options[OPT_CLICK])
  126.                         fclr(*PubFlags,TDPF_NOCLICK);
  127.                     if(Options[OPT_NOCLICK])
  128.                         fset(*PubFlags,TDPF_NOCLICK);
  129.                     States[STATE_CLICK]=ftst(*PubFlags,TDPF_NOCLICK) ? OFF : ON;
  130.                     CloseDevice((struct IORequest *)IO);
  131.                 }
  132.             }
  133.             DeleteIORequest(IO);
  134.         }
  135.         DeleteMsgPort(Port);
  136.     }
  137.  
  138.     /* Wildstar */
  139.     DOSFlags=&DOSBase->dl_Root->rn_Flags;
  140.     if(Options[OPT_STAR])                                                        /* Enable */
  141.         fset(*DOSFlags,RNF_WILDSTAR);
  142.     if(Options[OPT_NOSTAR])                                                    /* Disable */
  143.         fclr(*DOSFlags,RNF_WILDSTAR);
  144.     if(ftst(*DOSFlags,RNF_WILDSTAR))
  145.         States[STATE_STAR]=ON;
  146.     else
  147.         States[STATE_STAR]=OFF;
  148.  
  149.     /* Piping */
  150.     if(HandleVar(PIPE_VAR_NAME,(STRPTR)Options[OPT_PIPE],DEF_PIPE,
  151.                                 Options[OPT_NOPIPE],&ErrOccured,PipeVal,DOSBase))
  152.         States[STATE_PIPE]=PipeVal;
  153.     else
  154.         States[STATE_PIPE]=OFF;
  155.  
  156.     /* Multi command execution */
  157.     if(HandleVar(MULTI_VAR_NAME,(STRPTR)Options[OPT_MULTI],DEF_MULTI,
  158.                                 Options[OPT_NOMULTI],&ErrOccured,MultiVal,DOSBase))
  159.         States[STATE_MULTI]=MultiVal;
  160.     else
  161.         States[STATE_MULTI]=OFF;
  162.  
  163.     /* Alerts timing */
  164.     if(Options[OPT_ALERT])
  165.         SysBase->LastAlert[3]=AlTime(*((LONG *)Options[OPT_ALERT]));
  166.     States[STATE_ALERT]=(STRPTR)SysBase->LastAlert[3];
  167.  
  168.     unless(Options[OPT_QUIET])
  169.         VPrintf("System state:\n"
  170.                         "\tDrive click is %s\n"
  171.                         "\tStar is %s\n"
  172.                         "\tPipe char is %s\n"
  173.                         "\tMulti command char is %s\n"
  174.                         "\tAlert lasts %lu frames\n",(LONG *)States);
  175.  
  176.     RC=(ErrOccured ? RETURN_ERROR : RETURN_OK);
  177.  
  178.     FreeArgs(Args);
  179. NoArgs:
  180.     CloseLibrary((struct Library *)DOSBase);
  181. InvalidDOS:
  182.     return(RC);
  183. }
  184.  
  185. STATIC LONG HandleVar(STRPTR varName, STRPTR varVal, STRPTR defVal, LONG off,
  186.                                             BOOL *error, STRPTR result, struct DosLibrary *DOSBase)
  187. {
  188.     struct LocalVar *Var;
  189.  
  190.     if(varVal)
  191.         unless(SetVar(varName,PStr(varVal,defVal),VAR_LEN,VAR_FLAGS))
  192.         {
  193.             PrintFault(IoErr(),varName);
  194.             *error=TRUE;
  195.         }
  196.     if(off)
  197.         unless(DeleteVar(varName,VAR_FLAGS))
  198.         {
  199.             PrintFault(IoErr(),varName);
  200.             *error=TRUE;
  201.         }
  202.     if(Var=FindVar(varName,VAR_FLAGS))
  203.     {
  204.         result[0]='\'';
  205.         result[1]=*(Var->lv_Value);
  206.         result[2]='\'';
  207.         result[3]='\0';
  208.     }
  209.     return((LONG)Var);                                                            /* Check current state */
  210. }
  211.